package com.study.modules.designPatterns.No1SingletonMode;

/**
 * 双重检查锁
 * 双重检查锁是一种优化技术，它可以避免在多线程环境下，JVM对同一个类进行初始化时，
 * 不同的线程会同时进行初始化，从而导致多个实例。
 * 双重检查锁可以保证在多线程环境下，JVM只会对SingletonDoubleCheckLock类进行初始化一次。
 * <p>
 * 优点： 线程安全
 * 缺点： 性能低
 */
public class SingletonDoubleCheckLock {
    private volatile static SingletonDoubleCheckLock instance;

    private SingletonDoubleCheckLock() {
    }

    public static SingletonDoubleCheckLock getInstance() {
        if (instance == null) {
            synchronized (SingletonDoubleCheckLock.class) {
                if (instance == null) {
                    instance = new SingletonDoubleCheckLock();
                }
            }
        }
        return instance;
    }
}
